# blueprint: 用来做模块化的
from flask import Blueprint, render_template, jsonify, redirect, url_for, session
from exts import mail, db
from flask_mail import Message
from werkzeug.security import generate_password_hash, check_password_hash

from flask import request
import string
import random
from models import EmailCaptchaModel

from .forms import RegisterForm, LoginForm

from models import UserModel


User = Blueprint("User_Auth", __name__, url_prefix="/User_Auth")


@User.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template("login.html")
    else:
        form = LoginForm(request.form)
        if form.validate():
            email = form.email.data
            password = form.password.data
            user = UserModel.query.filter_by(email=email).first()
            if not user:
                return redirect(url_for("User_Auth.login"))
            if check_password_hash(user.password, password):
                # cookie：
                # cookie中不适合存储太多的数据，只适合存储少量的数据
                # cookie一般用来存放登录授权的东西
                # flask中的session，是经过加密后存储在cookie中的
                session['user_id'] = user.id
                return redirect("/")
            else:
                print("密码错误")
                return redirect(url_for("User_Auth.login"))
        else:
            print(form.errors)
            return redirect(url_for("User_Auth.login"))


# 注册模板渲染
# GET：从服务器上获取数据
# POST：将客户端的数据提交给服务器
@User.route("/register", methods=['GET', 'POST'])
def register():
    if request.method == 'GET':
        return render_template("register.html")
    else:
        # 验证用户提交的邮箱和验证码是否对应且正确
        # 表单验证：flask-wtf: wtforms
        form = RegisterForm(request.form)
        if form.validate():
            email = form.email.data
            username = form.username.data
            password = form.password.data
            user = UserModel(email=email, username=username, password=generate_password_hash(password))
            db.session.add(user)
            db.session.commit()
            return redirect(url_for("User_Auth.login"))     # 重定向，重新跳转到登录页面
        else:
            print(form.errors)
            return redirect(url_for("User_Auth.register"))


@User.route("/logout")
def logout():
    session.clear()
    return redirect("/")


# bp.route：如果没有指定methods参数，默认就是GET请求
@User.route("/captcha/email")
def get_captcha_email():
    # 两种传参的方法
    # /captcha/email/<email>
    # /captcha/email?email=xxx@qq.com
    email = request.args.get("email")
    # 4/6：随机数组、字母、数组和字母的组合
    source = string.digits*4
    captcha = random.sample(source, 4)
    captcha = "".join(captcha)
    # I/O：Input/Output
    message = Message("商职表白墙客服中心",
                      recipients=[email],
                      )
    message.body = (f"这里是商职表白墙客服中心，您注册我们的商职表白墙网站账号邮箱验证码为：[{captcha}]，请确认是您本人在操作，请勿向其他人提供您的验证码."
                    "这封电子邮件由系统自动生成，请勿回复，"
                    "如果您需要额外帮助，请访问商职表白墙客服中心[QQ：2655420463]，"
                    "或者把您的建议发送邮件给商职表白墙客服中心[2655420463@qq.com]，祝您使用愉快，谢谢")

    mail.send(message)
    # memcached/redis
    # 用数据库表的方式存储
    email_captcha = EmailCaptchaModel(email=email, captcha=captcha)
    db.session.add(email_captcha)
    db.session.commit()     # 提交到数据库
    # RESTful API
    # {code: 200/400/500, message: "", data: {}}
    return jsonify({"code": 200, "message": "", "data": "None"})


@User.route("/mail/test")
def mail_test():
    """
    subject： 主题
    recipients： 收件人
    body： 未知
    """
    message = Message("商职表白墙客服中心",
                      recipients=["2484601608@qq.com"],
                      )
    message.body = ("这里是商职表白墙客服中心, 您的注册我们网站账号邮箱验证码为：xxxxx, 请确认是您本人在操作, 请勿向其他人提供您的验证码."
                    "这封电子邮件由系统自动生成, 请勿回复, 如果您需要额外帮助, 请访问商职客服中心(QQ：2655420463)")

    mail.send(message)
    return "邮箱发送成功"
